{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quantile Regression Q-Learning"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "import torch.optim as optim\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "from IPython.display import clear_output\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from timeit import default_timer as timer\n",
    "from datetime import timedelta\n",
    "import math\n",
    "\n",
    "from utils.wrappers import *\n",
    "from agents.DQN import Model as DQN_Agent\n",
    "from utils.ReplayMemory import ExperienceReplayMemory\n",
    "from networks.layers import NoisyLinear\n",
    "\n",
    "from utils.hyperparameters import Config"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hyperparameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "config = Config()\n",
    "\n",
    "config.device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "#epsilon variables\n",
    "config.epsilon_start = 1.0\n",
    "config.epsilon_final = 0.01\n",
    "config.epsilon_decay = 60000\n",
    "config.epsilon_by_frame = lambda frame_idx: config.epsilon_final + (config.epsilon_start - config.epsilon_final) * math.exp(-1. * frame_idx / config.epsilon_decay)\n",
    "\n",
    "#misc agent variables\n",
    "config.GAMMA=0.99\n",
    "config.LR=1e-4\n",
    "\n",
    "#memory\n",
    "config.TARGET_NET_UPDATE_FREQ = 1000\n",
    "config.EXP_REPLAY_SIZE = 100000\n",
    "config.BATCH_SIZE = 32\n",
    "\n",
    "#Learning control variables\n",
    "config.LEARN_START = 10000\n",
    "config.MAX_FRAMES=1000000\n",
    "\n",
    "#Nstep controls\n",
    "config.N_STEPS=1\n",
    "\n",
    "#Quantile Regression Parameters\n",
    "config.QUANTILES=51"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class QRDQN(nn.Module):\n",
    "    def __init__(self, input_shape, num_actions, quantiles=51):\n",
    "        super(QRDQN, self).__init__()\n",
    "        \n",
    "        self.input_shape = input_shape\n",
    "        self.num_actions = num_actions\n",
    "        self.quantiles=quantiles\n",
    "\n",
    "        self.conv1 = nn.Conv2d(self.input_shape[0], 32, kernel_size=8, stride=4)\n",
    "        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)\n",
    "        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)\n",
    "\n",
    "        self.fc1 = nn.Linear(self.feature_size(), 512)\n",
    "        self.fc2 = nn.Linear(512, self.num_actions*self.quantiles)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.conv1(x))\n",
    "        x = F.relu(self.conv2(x))\n",
    "        x = F.relu(self.conv3(x))\n",
    "        x = x.view(x.size(0), -1)\n",
    "        x = F.relu(self.fc1(x))\n",
    "        x = self.fc2(x)\n",
    "\n",
    "        return x.view(-1, self.num_actions, self.quantiles)\n",
    "    \n",
    "    def feature_size(self):\n",
    "        return self.conv3(self.conv2(self.conv1(torch.zeros(1, *self.input_shape)))).view(1, -1).size(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Model(DQN_Agent):\n",
    "    def __init__(self, static_policy=False, env=None, config=None):\n",
    "        self.num_quantiles = config.QUANTILES\n",
    "        self.cumulative_density = torch.tensor((2 * np.arange(self.num_quantiles) + 1) / (2.0 * self.num_quantiles), device=config.device, dtype=torch.float) \n",
    "        self.quantile_weight = 1.0 / self.num_quantiles\n",
    "\n",
    "        super(Model, self).__init__(static_policy, env, config)\n",
    "    \n",
    "    def declare_networks(self):\n",
    "        self.model = QRDQN(self.num_feats, self.num_actions, quantiles=self.num_quantiles)\n",
    "        self.target_model = QRDQN(self.num_feats, self.num_actions, quantiles=self.num_quantiles)\n",
    "        \n",
    "    def next_distribution(self, batch_vars):\n",
    "        batch_state, batch_action, batch_reward, non_final_next_states, non_final_mask, empty_next_state_values, indices, weights = batch_vars\n",
    "\n",
    "        with torch.no_grad():\n",
    "            quantiles_next = torch.zeros((self.batch_size, self.num_quantiles), device=self.device, dtype=torch.float)\n",
    "            if not empty_next_state_values:\n",
    "                max_next_action = self.get_max_next_state_action(non_final_next_states)\n",
    "                quantiles_next[non_final_mask] = self.target_model(non_final_next_states).gather(1, max_next_action).squeeze(dim=1)\n",
    "\n",
    "            quantiles_next = batch_reward + (self.gamma*quantiles_next)\n",
    "\n",
    "        return quantiles_next\n",
    "    \n",
    "    def compute_loss(self, batch_vars):\n",
    "        batch_state, batch_action, batch_reward, non_final_next_states, non_final_mask, empty_next_state_values, indices, weights = batch_vars\n",
    "\n",
    "        batch_action = batch_action.unsqueeze(dim=-1).expand(-1, -1, self.num_quantiles)\n",
    "\n",
    "        quantiles = self.model(batch_state)\n",
    "        quantiles = quantiles.gather(1, batch_action).squeeze(1)\n",
    "\n",
    "        quantiles_next = self.next_distribution(batch_vars)\n",
    "          \n",
    "        diff = quantiles_next.t().unsqueeze(-1) - quantiles.unsqueeze(0)\n",
    "\n",
    "        loss = self.huber(diff) * torch.abs(self.cumulative_density.view(1, -1) - (diff < 0).to(torch.float))\n",
    "        loss = loss.transpose(0,1)\n",
    "        loss = loss.mean(1).sum(-1).mean()\n",
    "\n",
    "        return loss\n",
    "    \n",
    "    def get_action(self, s, eps):\n",
    "        with torch.no_grad():\n",
    "            if np.random.random() >= eps:\n",
    "                X = torch.tensor([s], device=self.device, dtype=torch.float) \n",
    "                a = (self.model(X) * self.quantile_weight).sum(dim=2).max(dim=1)[1]\n",
    "                return a.item()\n",
    "            else:\n",
    "                return np.random.randint(0, self.num_actions)\n",
    "            \n",
    "    def get_max_next_state_action(self, next_states):\n",
    "        next_dist = self.target_model(next_states)*self.quantile_weight\n",
    "        return next_dist.sum(dim=2).max(1)[1].view(next_states.size(0), 1, 1).expand(-1, -1, self.num_quantiles)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot(frame_idx, rewards, losses, sigma, elapsed_time):\n",
    "    clear_output(True)\n",
    "    plt.figure(figsize=(20,5))\n",
    "    plt.subplot(131)\n",
    "    plt.title('frame %s. reward: %s. time: %s' % (frame_idx, np.mean(rewards[-10:]), elapsed_time))\n",
    "    plt.plot(rewards)\n",
    "    if losses:\n",
    "        plt.subplot(132)\n",
    "        plt.title('loss')\n",
    "        plt.plot(losses)\n",
    "    if sigma:\n",
    "        plt.subplot(133)\n",
    "        plt.title('noisy param magnitude')\n",
    "        plt.plot(sigma)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training Loop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "start=timer()\n",
    "\n",
    "env_id = \"PongNoFrameskip-v4\"\n",
    "env    = make_atari(env_id)\n",
    "env    = wrap_deepmind(env, frame_stack=False)\n",
    "env    = wrap_pytorch(env)\n",
    "model = Model(env=env, config=config)\n",
    "\n",
    "episode_reward = 0\n",
    "\n",
    "observation = env.reset()\n",
    "for frame_idx in range(1, config.MAX_FRAMES + 1):\n",
    "    epsilon = config.epsilon_by_frame(frame_idx)\n",
    "    \n",
    "    action = model.get_action(observation, epsilon)\n",
    "    prev_observation=observation\n",
    "    observation, reward, done, _ = env.step(action)\n",
    "    observation = None if done else observation\n",
    "\n",
    "    model.update(prev_observation, action, reward, observation, frame_idx)\n",
    "    episode_reward += reward\n",
    "\n",
    "    if done:\n",
    "        model.finish_nstep()\n",
    "        model.reset_hx()\n",
    "        observation = env.reset()\n",
    "        model.save_reward(episode_reward)\n",
    "        episode_reward = 0\n",
    "        \n",
    "        if np.mean(model.rewards[-10:]) > 19:\n",
    "            plot(frame_idx, model.rewards, model.losses, model.sigma_parameter_mag, timedelta(seconds=int(timer()-start)))\n",
    "            break\n",
    "\n",
    "    if frame_idx % 10000 == 0:\n",
    "        plot(frame_idx, model.rewards, model.losses, model.sigma_parameter_mag, timedelta(seconds=int(timer()-start)))\n",
    "\n",
    "model.save_w()\n",
    "env.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
